// 患者信息接口
export interface PatientInfo {
  patientId: number;        // 患者ID
  patientName: string;      // 患者姓名
  patientGender: string;    // 患者性别 (1-男, 0-女)
  patientPhone: string;     // 患者手机号
  ageYear: number;          // 年龄-年
  ageMonth: number;         // 年龄-月
  isMember: string;         // 是否会员 (1-是, 0-否)
  idCard: string;           // 身份证号
  solarBirthday: string;    // 公历生日
  lunarBirthday: string;
}

// 患者列表响应类型
export interface PatientListResponse {
  code: string;
  msg: string;
  timestamp: number;
  data: PatientInfo[];
  ok: boolean;
}

// 患者查询参数
export interface PatientQueryParams {
  keyword?: string;         // 搜索关键词
  gender?: string;          // 性别筛选
  isMember?: string;        // 会员筛选
  pageNum?: number;         // 页码
  pageSize?: number;        // 每页大小
}

// 患者性别枚举
export enum PatientGender {
  FEMALE = '0',  // 女
  MALE = '1',    // 男
  OTHER = '3'    // 其他
}

// 婚姻状况枚举
export enum MaritalStatus {
  UNMARRIED = '0',  // 未婚
  MARRIED = '1'     // 已婚
}

// 民族枚举（常用）
export enum Ethnicity {
  HAN = '1',        // 汉族
  MONGOL = '2',     // 蒙古族
  HUI = '3',        // 回族
  TIBETAN = '4',    // 藏族
  UYGHUR = '5',     // 维吾尔族
  MIAO = '6',       // 苗族
  YI = '7',         // 彝族
  ZHUANG = '8',     // 壮族
  BUYEI = '9',      // 布依族
  KOREAN = '10',    // 朝鲜族
  // 可以根据需要添加更多民族
}
// 患者详情
export interface PatientDetail {
  patientId?: number | null;        // 患者ID
  patientName: string;      // 患者姓名
  patientGender?: string;    // 患者性别 (1-男, 0-女, 3-其他)
  patientPhone: string;     // 患者手机号
  ageYear: number | null;          // 年龄-年
  ageMonth: number | null;         // 年龄-月
  isMember?: string;         // 是否会员 (1-是, 0-否)
  idCard: string;           // 身份证号
  solarBirthday: string;    // 公历生日
  lunarBirthday: string;    // 农历生日
  weight: number | null;           // 体重
  systolicBp: number | null;       // 收缩压
  diastolicBp: number | null;      // 舒张压
  height: number | null;           // 身高
  ethnicity: string;        // 民族
  isMarried: string;        // 婚姻状况 (1-已婚, 0-未婚)
  company: string;          // 工作单位
  job: string;              // 职业
  province: string;         // 省份代码
  city: string;             // 城市代码
  county: string;           // 区县代码
  address: string;          // 详细地址
  medicalHistory: string;   // 既往病史
  allergyHistory: string | null;   // 过敏史
  remark: string | null;           // 备注
  lastVisitDate?: string | null;  // 最后就诊日期
  balance?: number | null;          // 余额
  lastRechargeTime: string; // 最后充值时间
  fieldList: PatientFieldInfo[];  // 字段列表
}

// 患者字段信息（继承医疗记录字段）
export interface PatientFieldInfo {
  fieldId: number;          // 字段ID
  fieldName: string;        // 字段名称
  fieldCode: string;        // 字段代码
  fieldType: string;        // 字段类型
  fieldScope: string;       // 字段范围
  isRequired: string;       // 是否必填
  isRecom: string;          // 是否推荐
  isVoice: string;          // 是否支持语音
  isImage: string;          // 是否支持图片
  isPulse: string;          // 是否支持脉搏
  isCycle: string;          // 是否周期性
  isDefault: string;        // 是否默认
  sortNum: number;          // 排序号
  treeList: PatientFieldTreeNode[];  // 树形选项列表
}

// 患者字段树节点
export interface PatientFieldTreeNode {
  id: number;               // 节点ID
  fieldId: number;          // 字段ID
  value: string;            // 节点值
  text: string;             // 节点文本
  parentId: number;         // 父节点ID
  sortNum: number;          // 排序号
  children: PatientFieldTreeNode[];  // 子节点列表
}

// 患者详情API响应
export interface PatientDetailResponse {
  code: string;
  msg: string;
  timestamp: number;
  data: PatientDetail;
  ok: boolean;
}
export interface PatientDetailPatientId {
  patientId: number | null;        // 患者ID
  visitDate?: string;       // 就诊日期
  pageNo?: number;           // 页码
  pageSize?: number;        // 每页大小
projectCategory?: string; // 项目类别 (如：1-检查, 2-检验, 3-治疗)
}

// 患者挂号记录信息
export interface PatientRegisterRecord {
  registerId: number;       // 挂号ID
  visitNo: string;          // 就诊号
  visitDate: string;        // 就诊日期
  visitPeriod: string;      // 就诊时段 (1-上午, 2-下午, 3-晚上)
  visitSeqNo: number;       // 就诊序号
  visitType: string;        // 就诊类型 (1-初诊, 2-复诊)
  regType: string;          // 挂号类型 (1-普通号, 2-专家号, 3-急诊号)
  doctorId: number;         // 医生ID
  doctorName: string;       // 医生姓名
  deptId: number;           // 科室ID
  deptName: string;         // 科室名称
  visitStartTime: string;   // 就诊开始时间
  visitEndTime: string;     // 就诊结束时间
  regFee: number;           // 挂号费
  regStatus: string;        // 挂号状态 (1-待就诊, 2-就诊中, 3-已完成, 4-已取消, 5-已退号)
  payStatus: string;        // 支付状态 (1-已支付, 2-未支付, 3-已退款)
  regChannel: string;       // 挂号渠道 (1-窗口, 2-自助机, 3-网络, 4-电话)
  regMethod: string;        // 挂号方式 (1-现场, 2-预约)
  remark: string | null;    // 备注
}

// 患者挂号记录列表数据
export interface PatientRegisterListData {
  totalCount: number;       // 总数量
  list: PatientRegisterRecord[];  // 挂号记录列表
}

// 患者挂号记录API响应
export interface PatientRegisterListResponse {
  code: string;
  msg: string;
  timestamp: number;
  data: PatientRegisterListData;
  ok: boolean;
}

// 就诊时段枚举
export enum VisitPeriod {
  MORNING = '1',    // 上午
  AFTERNOON = '2',  // 下午
  EVENING = '3'     // 晚上
}

// 就诊类型枚举
export enum VisitType {
  FIRST_VISIT = '1',    // 初诊
  FOLLOW_UP = '2'       // 复诊
}

// 挂号类型枚举
export enum RegType {
  NORMAL = '1',     // 普通号
  EXPERT = '2',     // 专家号
  EMERGENCY = '3'   // 急诊号
}

// 挂号状态枚举
export enum RegStatus {
  WAITING = '1',    // 待就诊
  IN_VISIT = '2',   // 就诊中
  COMPLETED = '3',  // 已完成
  CANCELLED = '4',  // 已取消
  REFUNDED = '5'    // 已退号
}

// 支付状态枚举
export enum PayStatus {
  PAID = '1',       // 已支付
  UNPAID = '2',     // 未支付
  REFUNDED = '3'    // 已退款
}

// 挂号渠道枚举
export enum RegChannel {
  WINDOW = '1',     // 窗口
  SELF_SERVICE = '2', // 自助机
  ONLINE = '3',     // 网络
  PHONE = '4'       // 电话
}

// 挂号方式枚举
export enum RegMethod {
  ON_SITE = '1',    // 现场
  APPOINTMENT = '2' // 预约
}
// 会员状态枚举
export enum MemberStatus {
  NON_MEMBER = '0',  // 非会员
  MEMBER = '1'       // 会员
}

// 充值订单信息接口
export interface RechargeOrder {
  orderId: number;          // 订单ID
  orderNo: string;          // 订单号
  orderTime: string;        // 下单时间
  gearName: string;         // 档位名称
  payChannel: string;       // 支付渠道
  orderStatus: string;      // 订单状态
  rechargeAmount: number;   // 充值金额
  payAmount: number;        // 支付金额
  updateBy: string;         // 更新人
  updateTime: string;       // 更新时间
}

// 充值订单列表数据
export interface RechargeOrderListData {
  totalCount: number;       // 总数量
  list: RechargeOrder[];    // 订单列表
}

// 充值订单列表响应类型
export interface RechargeOrderListResponse {
  code: string;
  msg: string;
  timestamp: number;
  data: RechargeOrderListData;
  ok: boolean;
}

// 充值订单查询参数
export interface RechargeOrderQueryParams {
  patientId?: number | null;       // 患者ID
  orderStatus?: string;     // 订单状态
  payChannel?: string;      // 支付渠道
  orderNo?: string;      // 订单号
  pageNo?: number;         // 页码
  pageSize?: number;        // 每页大小
}

// 订单状态枚举
export enum OrderStatus {
  PENDING = '1',    // 待支付
  COMPLETED = '2',  // 已完成
  CANCELLED = '3',  // 已取消
  REFUNDED = '4'    // 已退款
}

// 支付渠道枚举
export enum PayChannel {
  ALIPAY = '3001',     // 支付宝
  WECHAT = '3002',     // 微信支付
  CASH = '3003',       // 现金
  CARD = '3004'        // 银行卡
}

// 工具函数：获取订单状态文本
export const getOrderStatusText = (status: string): string => {
  const statusMap: Record<string, string> = {
    '1': '待支付',
    '2': '已完成',
    '3': '已取消',
    '4': '已退款'
  };
  return statusMap[status] || '未知状态';
};

// 工具函数：获取支付渠道文本
export const getPayChannelText = (channel: string): string => {
  const channelMap: Record<string, string> = {
    '3001': '支付宝',
    '3002': '微信支付',
    '3003': '现金',
    '3004': '银行卡'
  };
  return channelMap[channel] || '未知渠道';
};

// 工具函数：获取订单状态颜色
export const getOrderStatusColor = (status: string): string => {
  const colorMap: Record<string, string> = {
    '1': '#f56c6c',    // 待支付 - 红色
    '2': '#67c23a',    // 已完成 - 绿色
    '3': '#909399',    // 已取消 - 灰色
    '4': '#e6a23c'     // 已退款 - 橙色
  };
  return colorMap[status] || '#909399';
};

// 工具函数：获取性别文本
export const getGenderText = (gender: string): string => {
  const genderMap: Record<string, string> = {
    '0': '女',
    '1': '男',
    '3': '其他'
  };
  return genderMap[gender] || '未知';
};

// 工具函数：获取就诊时段文本
export const getVisitPeriodText = (period: string): string => {
  const periodMap: Record<string, string> = {
    '1': '上午',
    '2': '下午',
    '3': '晚上'
  };
  return periodMap[period] || '未知';
};

// 工具函数：获取就诊类型文本
export const getVisitTypeText = (type: string): string => {
  const typeMap: Record<string, string> = {
    '1': '初诊',
    '2': '复诊'
  };
  return typeMap[type] || '未知';
};

// 工具函数：获取挂号类型文本
export const getRegTypeText = (type: string): string => {
  const typeMap: Record<string, string> = {
    '1': '普通号',
    '2': '专家号',
    '3': '急诊号'
  };
  return typeMap[type] || '未知';
};

// 工具函数：获取挂号状态文本
export const getRegStatusText = (status: string): string => {
  const statusMap: Record<string, string> = {
    '1': '待就诊',
    '2': '就诊中',
    '3': '已完成',
    '4': '已取消',
    '5': '已退号'
  };
  return statusMap[status] || '未知状态';
};

// 工具函数：获取支付状态文本
export const getPayStatusText = (status: string): string => {
  const statusMap: Record<string, string> = {
    '1': '已支付',
    '2': '未支付',
    '3': '已退款'
  };
  return statusMap[status] || '未知状态';
};

// 工具函数：获取挂号渠道文本
export const getRegChannelText = (channel: string): string => {
  const channelMap: Record<string, string> = {
    '1': '窗口',
    '2': '自助机',
    '3': '网络',
    '4': '电话'
  };
  return channelMap[channel] || '未知渠道';
};

// 工具函数：获取挂号方式文本
export const getRegMethodText = (method: string): string => {
  const methodMap: Record<string, string> = {
    '1': '现场',
    '2': '预约'
  };
  return methodMap[method] || '未知方式';
};

// 工具函数：获取挂号状态颜色
export const getRegStatusColor = (status: string): string => {
  const colorMap: Record<string, string> = {
    '1': '#f56c6c',    // 待就诊 - 红色
    '2': '#e6a23c',    // 就诊中 - 橙色
    '3': '#67c23a',    // 已完成 - 绿色
    '4': '#909399',    // 已取消 - 灰色
    '5': '#909399'     // 已退号 - 灰色
  };
  return colorMap[status] || '#909399';
};

// 工具函数：获取支付状态颜色
export const getPayStatusColor = (status: string): string => {
  const colorMap: Record<string, string> = {
    '1': '#67c23a',    // 已支付 - 绿色
    '2': '#f56c6c',    // 未支付 - 红色
    '3': '#e6a23c'     // 已退款 - 橙色
  };
  return colorMap[status] || '#909399';
};

// 工具函数：获取婚姻状况文本
export const getMaritalStatusText = (status: string): string => {
  const statusMap: Record<string, string> = {
    '0': '未婚',
    '1': '已婚'
  };
  return statusMap[status] || '未知';
};

// 工具函数：获取会员状态文本
export const getMemberStatusText = (isMember: string): string => {
  return isMember === '1' ? '会员' : '非会员';
};

// 工具函数：获取民族文本
export const getEthnicityText = (ethnicity: string): string => {
  const ethnicityMap: Record<string, string> = {
    '1': '汉族',
    '2': '蒙古族',
    '3': '回族',
    '4': '藏族',
    '5': '维吾尔族',
    '6': '苗族',
    '7': '彝族',
    '8': '壮族',
    '9': '布依族',
    '10': '朝鲜族'
    // 可以根据需要添加更多
  };
  return ethnicityMap[ethnicity] || '其他';
};

// 工具函数：计算年龄描述
export const getAgeDescription = (ageYear: number, ageMonth: number): string => {
  if (ageYear === 0) {
    return `${ageMonth}个月`;
  }
  if (ageMonth === 0) {
    return `${ageYear}岁`;
  }
  return `${ageYear}岁${ageMonth}个月`;
};

// 工具函数：格式化血压显示
export const formatBloodPressure = (systolic: number, diastolic: number): string => {
  return `${systolic}/${diastolic} mmHg`;
};

// 工具函数：验证身份证号
export const validateIdCard = (idCard: string): boolean => {
  const idCardRegex = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
  return idCardRegex.test(idCard);
};

// 工具函数：从身份证号获取出生日期
export const getBirthdayFromIdCard = (idCard: string): string | null => {
  if (!validateIdCard(idCard)) {
    return null;
  }
  
  let birthYear, birthMonth, birthDay;
  
  if (idCard.length === 15) {
    birthYear = '19' + idCard.substring(6, 8);
    birthMonth = idCard.substring(8, 10);
    birthDay = idCard.substring(10, 12);
  } else if (idCard.length === 18) {
    birthYear = idCard.substring(6, 10);
    birthMonth = idCard.substring(10, 12);
    birthDay = idCard.substring(12, 14);
  }
  
  return `${birthYear}-${birthMonth}-${birthDay}`;
};

// 工具函数：从身份证号获取性别
export const getGenderFromIdCard = (idCard: string): string | null => {
  if (!validateIdCard(idCard)) {
    return null;
  }
  
  let genderCode: number;
  if (idCard.length === 15) {
    genderCode = parseInt(idCard.substring(14, 15));
  } else if (idCard.length === 18) {
    genderCode = parseInt(idCard.substring(16, 17));
  } else {
    return null;
  }
  
  return genderCode % 2 === 0 ? '0' : '1'; // 偶数为女，奇数为男
};
